import React, { useMemo } from "react";
import {
  FileTextOutlined,
  FileImageOutlined,
  FilePdfOutlined,
  FileExcelOutlined,
  FileWordOutlined,
  FilePptOutlined,
  FileUnknownOutlined,
} from "@ant-design/icons";
import { Icons } from "@/utils/icons";

/**
 * 文件工具 Hook，提供文件图标和大小格式化功能
 *
 * @example
 * ```tsx
 * const { getFileIcon, formatFileSize } = useFileUtils();
 *
 * // 获取文件图标
 * const icon = getFileIcon('application/pdf');
 *
 * // 格式化文件大小
 * const readableSize = formatFileSize(1024 * 1024 * 2.5); // "2.5 MB"
 * ```
 */
export function useFileUtils() {
  return useMemo(
    () => ({
      /**
       * 根据文件类型获取对应的图标组件
       * @param fileType MIME类型或文件扩展名
       * @param color 是否启用颜色（默认为true）
       * @returns React组件
       */
      getFileIcon: (
        fileType: string = "",
        color: boolean = true
      ): React.ReactNode => {
        if (!fileType)
          return <FileUnknownOutlined className={color ? "file-icon" : ""} />;

        // 标准化类型字符串为小写
        const type = fileType.toLowerCase();

        // 提取扩展名
        let extension = "";
        if (type.includes("/")) {
          // 如果是MIME类型，尝试从MIME类型中提取扩展名
          const parts = type.split("/");
          if (parts.length > 1) {
            extension = parts[1];
          }
        } else if (type.includes(".")) {
          // 如果包含点，可能是文件名或扩展名
          extension = type.split(".").pop() || "";
        } else {
          // 可能直接就是扩展名
          extension = type;
        }

        // 按指定类型进行严格匹配
        // Word文档
        if (
          extension === "doc" ||
          extension === "docx" ||
          type.includes("msword") ||
          type.includes("officedocument.wordprocessingml")
        ) {
          return (
            <Icons.FileTXT
              className={color ? "file-icon file-icon-word" : ""}
            />
          );
        }

        // Excel表格
        if (
          extension === "xls" ||
          extension === "xlsx" ||
          type.includes("spreadsheetml") ||
          type.includes("ms-excel")
        ) {
          return (
            <Icons.FileXlS
              className={color ? "file-icon file-icon-excel" : ""}
            />
          );
        }

        // PowerPoint演示文稿
        if (
          extension === "ppt" ||
          extension === "pptx" ||
          type.includes("presentationml") ||
          type.includes("ms-powerpoint")
        ) {
          return (
            <Icons.FilePPT className={color ? "file-icon file-icon-ppt" : ""} />
          );
        }

        // PDF文档
        if (extension === "pdf" || type.includes("pdf")) {
          return (
            <Icons.FilePDF className={color ? "file-icon file-icon-pdf" : ""} />
          );
        }

        // 纯文本文件
        if (
          extension === "txt" ||
          extension === "csv" ||
          type.includes("text/plain") ||
          type.includes("text/csv")
        ) {
          return (
            <Icons.FileTXT
              className={color ? "file-icon file-icon-text" : ""}
            />
          );
        }

        // 图片文件 - 仅支持指定的格式
        if (
          ["jpeg", "jpg", "png", "tif", "tiff", "gif"].includes(extension) ||
          (type.includes("image/") &&
            (type.includes("jpeg") ||
              type.includes("jpg") ||
              type.includes("png") ||
              type.includes("tif") ||
              type.includes("tiff") ||
              type.includes("gif")))
        ) {
          return (
            <Icons.FileImage
              className={color ? "file-icon file-icon-image" : ""}
            />
          );
        }

        // 其他所有类型都显示为未知文件
        return <FileUnknownOutlined className={color ? "file-icon" : ""} />;
      },

      /**
       * 格式化文件大小为人类可读格式
       * @param sizeInBytes 文件大小（字节）
       * @param decimals 小数位数（默认为1）
       * @returns 格式化后的字符串
       */
      formatFileSize: (sizeInBytes: number, decimals: number = 1): string => {
        if (sizeInBytes === 0) return "0 B";

        const k = 1024;
        const sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];

        const i = Math.floor(Math.log(sizeInBytes) / Math.log(k));

        // 特殊处理字节，不显示小数
        if (i === 0) return `${sizeInBytes} ${sizes[i]}`;

        return `${parseFloat(
          (sizeInBytes / Math.pow(k, i)).toFixed(decimals)
        )} ${sizes[i]}`;
      },

      /**
       * 获取文件扩展名
       * @param filename 文件名
       * @returns 扩展名（不含点，小写）
       */
      getFileExtension: (filename: string): string => {
        if (!filename || typeof filename !== "string") return "";
        return filename
          .slice(((filename.lastIndexOf(".") - 1) >>> 0) + 2)
          .toLowerCase();
      },

      /**
       * 检查文件类型是否为图片
       * @param fileType MIME类型或文件扩展名
       * @returns 布尔值
       */
      isImageFile: (fileType: string = ""): boolean => {
        if (!fileType) return false;

        const type = fileType.toLowerCase();
        return (
          type.includes("image/") ||
          /\.(jpg|jpeg|png|gif|bmp|webp|svg)$/i.test(`.${type}`)
        );
      },
    }),
    []
  );
}

export default useFileUtils;
